package flyweight.source;

/**
 * 享元模式 -- 运用共享技术有效支持大量细粒度的对象
 *
 * 在享元对象内部并且不会随着环境改变而改变的共享部分，可以称之为享元对象的内部状态
 * 反之则称为外部状态。享元模式可以避免大量非常相类似的开销。
 * 程序设计中，有时需要生成大量细粒度的类实例来表示数据，然而这些实例除了几个参数外都是相同的
 * 将这些参数移到类实例的外面，调用方法时传递，可以通过共享大幅度减少单个实例的数目
 *
 * 应用：
 * 如果一个应用程序使用了大量的对象，而大量的对象造成了很大的存储开销
 * 或者对象的大多数状态可以设置为外部状态，如果删除外部状态，可以用较少的共享对象取代很多组对象
 *
 * 例如：
 * String常量池的使用。每次创建字符串都需要创建一个String对象，内存开销会很大。
 * 第一次创建了某个字符串对象后，再次创建相同内容字符串时，会将之前已经创建好的字符串对象返回还给你
 *
 * 例如象棋、五子棋等游戏的棋子，大量的棋子对象如果创建会消耗内存，因此用享元模式，外部状态为坐标
 * 内部状态为颜色。如此只需要两个棋子实例，记录所有坐标，打印即可
 *
 * 但是：享元工厂需要维护一个记录了系统所有享元的列表，本身就已经消耗资源，而为了使对象共享，需要将一些状态外部化，增加了程序的复杂度
 * 因此当有足够多的对象实例可供共享时才值得使用享元模式
 *
 * @author cheng:
 * @date 2019/4/25 10:28
 */
public interface Flyweight {
    /**
     * 所有具体享元类的接口
     * @param extrinsicstate 存储空间
     */
    void operation(int extrinsicstate);
}
